之前已经说过,在hexo中新建一篇博文非常简单,只需要在git bash中输入以下命令回车执行即可。1
> hexo new "title"
一般新建完之后,就需要对该博文源代码进行编辑,通常你需要依次打开 hexo-home/source/_post 目录,然后在成堆的Markdown文件中找到刚才创建的文档title.md。虽然hexo以你输入的title来给你的Markdown文件命名,命名的不咋地(诸如,空格和.
变成-
,括号(xxx)
变成-xxx-
,而且通常我们需要为博文源代码文件名字加个前缀,这样更加容易管理),你通常需要找到该文件,重新起个名字再打开,但是很多时候,命名的还是过得去的。藏在这么深的目录下,每次都得去找一番甚是烦人,有没有什么办法能够创建完(也就是敲个回车)之后自动帮我们用系统上已经安装的Markdown编辑器打开呢?
搜寻
所以上网一搜,搜到这样一篇文章《在 hexo new 之后立即打开新建的 Markdown 文稿》。内容嘛,这里就不多说了,大概的步骤我就摘在下面,有兴趣的你可以点进去看一下。
Tommy (就是弄这个Hexo的鼻祖,博主还说Hexo是其时为大学生的台湾人Tommy开发的轻量级静态博客生成器,具有简洁、快速、扩展性好等特点,我们都得感谢此大牛,真心感谢,这个好东西,太赞了!!) 指出,可以在 Hexo 目录下的 scripts 目录(若没有,则新建一个)中创建一个JavaScript 脚本,监听 hexo new 这个动作。并在检测到 hexo new 之后,执行编辑器打开的命令。
Tommy给出的代码如下:
1 | var spawn = require('child_process').spawn; |
博主就是参考这个代码,领悟到其精髓后,给出了自己实践可行的代码。
我 (是该博客博主,蓝色部分均摘自博客) 使用的 Hexo 是 2.5.4 版本,然而,测试过 Tommy 给出的代码之后并没有顺利地打开编辑器。不过精髓已经理解,需要的就只是细节的改变了。
简单翻阅了一下 JavaScript 的语法规则,我尝试了下列 JavaScript 代码:
1 | var exec = require('child_process').exec; |
注意,我这里执行的系统命令,是 OS X 下的 open。换到 Windows 中,可能需要改为 start。
卧槽,博主有钱淫,用的是苹果机…我可是穷渣渣,只能用Windows,那他说可能改为start,我就试一下嘛,照着他说的一步一步来(如果你是苹果机,可以照着这里的代码改改看,应该可以吧,虽然我没试过)。
试水
第一步:
在根目录新建一个文件夹scripts(因为本来没有,只能新建),然后新建txt文本文件,重命名为 “open_editor_after_hexo_new_immediately.js”,这个在Windows下干活的人都知道吧,名字可以随便,不过我觉得这个名字比较好认,你以后可能要改也方便。
第二步:
随便用一个文本编辑器打开,我是习惯用Sublime Text。修改内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14var exec = require('child_process').exec;
// Hexo 2.x 传进来的参数即是路径
/*
hexo.on('new', function(path){
exec('"S:\\Hexo\\MarkdownPad2\\MarkdownPad2.exe" ' + "\"" + [path] + "\"");
});
*/
// Hexo 3 传进来的参数是一个{}定义的多属性对象,
// 参见"hexo根目录/node_modules/hexo/lib/plugins/console/new.js"
hexo.on('new', function(data){
exec('"S:/Hexo/MarkdownPad2/MarkdownPad2.exe" ' + "\"" + [data.path] + "\"");
});
回头分析
其实上面的代码是经过近半个小时的折腾才弄出来的,亲测可用。现在说说这个过程顺便简单分析一下。
1. 首先当然是试了博主的代码,只不过改了start,之前是知道start是CMD里面用于重新打开一个窗口的命令;还有就是,参考鼻祖的Hexo 3的代码,因为之前已经说过,我从2.x迁移到3了(你也看到上面Hexo 2.x部分被我注释掉了)。试了一下,报-a
参数错误,肯定就把他删了再试,心想,而且知道这代码确实监听到我的hexo new
命令了。
2. 再new再回车,结果报“找不到文件D:/Workspace/Hexo”的错误,不过这个路径好像就是我Hexo根目录的路径,只不过,我那个是“D:/Workspace/Hexo Workspace”,我看到路径里面有个空格,想到以前曾经在CMD上踩过的坑,果断知道需要给路径加上个引号什么的。
3. 还好之前也弄过一点Javascript,知道用个”+”来拼接就行了,就试了一下。显然你去弄的话也知道这里还需要灵活使用一下转义符\
反斜杠。再试。
4. 成功用我系统上的编辑器MarkdownPad2打开我新new的博文源代码。我也明白了,其中原理不过像我们在CMD里面敲的一样吗,只不过这个CMD起始路径不知道而已,我想应该就是Git Bash的路径吧(这里就是我的Hexo根目录“D:/Workspace/Hexo Workspace”)。反正我们上面用的都是绝对路径,这点就无所谓了。
5. 想到这里,我想start也是没必要的,去掉一试,就成了上面的最终代码了。
之后也想弄清楚一下两个版本的代码为什么要不一样,心想传进来的其实都是函数的形式参数(本人有一点JS基础,不过跟其他语言在这一块原理差不多),只不过一个直接用,一个还需要索引。心想命令是hexo new
,就去Hexo根目录的node_modules找一下,应该有这么个名字的JS文件,果不其然,在“hexo根目录/node_modules/hexo/lib/plugins/console/new.js”,里面有段代码,内容如下:1
2
3
4
5
6var data = {
title: args._.pop(),
layout: args._.length ? args._[0] : this.config.default_layout,
slug: args.s || args.slug,
path: args.p || args.path
};
然后上网了解到JS里面用{}定义的叫做多属性对象,猜测Hexo 3传进来给new监听函数的参数是应该一个{}定义的多属性对象(如上面代码),通过.
操作符获取其path属性,而Hexo 2.x传进来的参数应该就是一个普通变量吧,通过不一样的方式获取到新建Markdown文件的全局路径。
Windows CMD下的\
和/
如果你仔细看上面我贴的用于Hexo 3和Hexo 2.x的代码,你会发现,上面用来获取MarkdownPad2编辑器的路径有点不一样,熟悉CMD的人应该都知道,这两种方式都是可以的,下面是我获取到的资料:
Windows 用反斜杠(”\”)的历史来自 DOS,而 DOS 的另一个传统是用斜杠(”/“)表示命令行参数,比如:
1 | cd %SystemDrive%dir |
既然 DOS 这边斜杠被占用了,只好找一个最接近的。那就是”\”了。
而在 UNIX 环境中,我们用减号(”-“)和双减号(”–”)表示命令行参数。
我们也知道,转义字符不是都用”\”么,所以如果用来当文件路径的话就要写成”\“。